#include "Arquivo.h"


Arquivo::Arquivo()
{
	this->mFim = false;
	this->mLinha = 0;

	
		
}
//recebe a linha lida no arquivo fonte
string Arquivo::GetLinha()
{
	
	//variavel para guardar linha
	string mLinha;
	
	//abre arquivo de entrada estatico, ou seja, abre apenas uma vez	
	static fstream mEntrada ("entrada.txt", ios::in);
	
	//le uma linha do arquivo
	getline(mEntrada , mLinha );
		
	//insere \n no fim da linha
	char *quebra = " \n ";

	mLinha.append(quebra);
	
	//retorna fim de arquivo ou n??????o
	mFim = mEntrada.eof();
	
	return mLinha;
				
}



bool Arquivo::Fim()
{
	return mFim;
}

vector<string> Arquivo::RetornaLinhaMepa()
{
	//variavel para guardar linha
	string mLinha;
	vector<string> mMepa;
	//abre arquivo de entrada estatico, ou seja, abre apenas uma vez	
	static fstream mEntrada ("entradaMepa.mep.", ios::in);
	

	while(! mEntrada.eof())
	{
		getline(mEntrada , mLinha);
		mMepa.push_back(mLinha);
	}
	/*
	for ( int i = 0  ; i < mMepa.size(); i++)
	{
		cout<<mMepa.at(i)<<";
	}	*/
	
	return mMepa;
	
}


vector<LinhaMepa> Arquivo::RetMepa(char *argc)
{
	this->mArquivoMEPA = argc;
	
	vector<LinhaMepa> mLinhasMepa;
	int mParametro;
	char* mInstrucao;	
	mInstrucao = new char[7];
	char aux;// auxiliar para espaco
	char retira[60];
	//abre arquivo de entrada estatico, ou seja, abre apenas uma vez	
	ifstream mEntrada (argc, ios::in);
	
	
	
	while( !mEntrada.eof())
	{
		LinhaMepa mInserir;
		
		mEntrada>>mParametro; // apenas retira o valor inteiro inicial
		
		mEntrada.read(&aux,1);//retira espaco
		
		mEntrada.get(mInstrucao,5); // le instrucao
		if(mEntrada.peek() == '\n')
		{	
			//seta a instrucao da linha
			mInserir.SetmLinha(mInstrucao);
			// insere no vetor
			mLinhasMepa.push_back(mInserir);
			mEntrada.getline(retira,50,'\n');
			continue;	
		}
			
		mEntrada.read(&aux,1);//retira espaco
		
		
		//seta a instrucao da linha
		mInserir.SetmLinha(mInstrucao);
		
		while((mEntrada.peek() >= '0' && mEntrada.peek() <= '9')|| mEntrada.peek() == '-')
		{
			mEntrada>>mParametro;
			mInserir.SetmParametro(mParametro);
			
			if(mEntrada.peek() == ',')
			{
				char aux;
				// retira a virgula
				mEntrada>>aux;
				continue;
			}
			break;
		}
		
		// insere no vetor
		mLinhasMepa.push_back(mInserir);
		mEntrada.getline(retira,50,'\n');	
		
	}
	return mLinhasMepa;
}
/*
void Arquivo::Chaves( Hash &mHash )
{
	ifstream mEntrada ( "Chaves.txt" , ios::in);
	
	string mLidaDaEntrada;
	string mInseridaNaHash;
	
	while( !mEntrada.eof() )
	{
		
		getline( mEntrada , mLidaDaEntrada );
		
		int cont = 0;
		//insere a palavra na hash sem pular linha
		
		while( cont < mLidaDaEntrada.size()-1 )
		{
			
			
			mInseridaNaHash.push_back(mLidaDaEntrada.at(cont));
			cont++;
			
			
		}
		mHash.InsHash(mInseridaNaHash);
		mInseridaNaHash.clear();
	}
	
}
*/
void Arquivo::ImprimeErro( int mLinha , int mTipo )
{
	
	static ofstream mSaida ("erro.txt", ios::out);
	
	if(mTipo == 1)
	{
		mSaida<<"caracter invalido na string :linha "<<mLinha<<endl;
	}
	if(mTipo == 2 )
	{
		mSaida<<"caracter invalido no inicio da string: linha"<<mLinha<<endl;
	}
	if(mTipo == 3 )
	{
		mSaida<<"comentario nao fechado : linha"<<mLinha<<endl;
	}
	if( mTipo == 4 )
	{
		mSaida<<"caracter invalido :linha "<<mLinha<<endl;
	}
		
}

void Arquivo::ImprimeMosmCabecalho(const char *saida)
{
	static ofstream mSaidaMosm(saida, ios::app);
	mSaidaMosm << "DUMP DE MEMORIA: " << this->mArquivoMEPA <<endl;
	mSaidaMosm << "-----------------------------" << endl;
}


void Arquivo::ImprimeMosmIS(const char* saida, int valorI, int valorS)
{
	static ofstream mSaidaMosm(saida, ios::app);

	mSaidaMosm << "i: ";
	mSaidaMosm.fill('0');
	mSaidaMosm.width(5);
	mSaidaMosm << valorI;
	mSaidaMosm << endl;

	mSaidaMosm << "s: ";
	mSaidaMosm.fill('0');
	mSaidaMosm.width(5);
	mSaidaMosm << valorS;
	mSaidaMosm <<endl;
}

void Arquivo::ImprimeMosmD(const char* saida, int index, int valor)
{
	static ofstream mSaidaMosm(saida, ios::app);
	mSaidaMosm << "D[";
	mSaidaMosm << index;
	mSaidaMosm << "]: ";
	mSaidaMosm.fill('0');
	mSaidaMosm.width(5);
	mSaidaMosm << valor;
	mSaidaMosm << endl;
}

void Arquivo::ImprimeMosmM(const char* saida, int index, string valor)
{
	static ofstream mSaidaMosm(saida, ios::app);
	mSaidaMosm << "[";
	mSaidaMosm.fill('0');
	mSaidaMosm.width(5);
	mSaidaMosm << index;
	mSaidaMosm << "] ";
	mSaidaMosm << valor;
	mSaidaMosm << endl;
}

void Arquivo::ImprimeMosmLinha(const char* saida, int qtd)
{
	static ofstream mSaidaMosm(saida, ios::app);
	mSaidaMosm.fill('-');
	mSaidaMosm.width(qtd);
	mSaidaMosm << "-";
	mSaidaMosm <<endl;
}

void Arquivo::ImprimeSaidaMepa(string comando)
{
	//formato do arquivo de saida encontrado no arquivo 3cop066-a16-t03.doc
	mLinha++;
	static ofstream mSaida("entradaMepa.mep", ios::out);
	mSaida<< mLinha <<" "<< comando << endl;
}


Arquivo::~Arquivo()
{
}
